// Package server: grpc 服务端.
// @author: zhenxinma.
// @create: 2021-10-03 23:08:13
package main

import (
	"context"
	"fmt"
	"log"
	"net"

	"google.golang.org/grpc"

	"gitee.com/zhenxinma/go_common/src/protos"
)

// Address Address: grpc 地址.
const Address = "127.0.0.1:9999"

// 用于实现约定的配置.
type helloService struct {
}

var HelloService = helloService{}

// TODO: 其实这样HelloService就已经实现了我们在protos通过service关键字定义出来的service类型的接口.

// SayHello 对于一个Service，第一个参数必须是context.Context.
func (s helloService) SayHello(ctx context.Context, request *protos.Request) (*protos.Response, error) {

	rsp := new(protos.Response)
	rsp.Message = fmt.Sprintf("helloService %s", request.Message)
	return rsp, nil
}

func main() {

	// 第一步: 开始监听端口.
	listen, err := net.Listen("tcp", Address)
	if nil != err {
		log.Println("run error: ", err.Error())
		return
	}

	// 第二步：实例化grpc Server.
	// NewServer参数是创建Server的一些参数.
	// 做一些初始化的工作.
	s := grpc.NewServer()
	// 第三步|：通过实例化好的grpc server开始 注册服务. 也就是开始注册HelloService.
	// 注册服务实现逻辑.
	// RegisterHelloServer 该方法是proto自动生成的，根据service关键字，并且通过plugin=grpc 来进行生成.
	protos.RegisterHelloServer(s, HelloService)
	// 不能对同一个Service实现多个Service实现.
	//protos.RegisterHelloServer(s, NoHelloService)
	// 启动.
	log.Println("running...")
	// 这个才是重点.
	s.Serve(listen)
}
